package com.ruoyi.common;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.MessageFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;


/**
 * CN：这里记录一些开发过程中的通用方法，以提升开发效率。
 * EN：Contains utility methods used during development to improve efficiency.
 */
public class GenericMethods {

    @Value("${system.logErrorPath}")
    private static String SYSTEM_LOGERROR_PATH;
    /**
     * CN：将 IP 地址从点分十进制表示法转换为数字字符串。
     * EN：Converts an IP address from dotted decimal notation to a numeric string.
     *
     * @param ip The IP address in dotted decimal notation (e.g., "192.168.1.1").
     * @return A numeric string representation of the IP address (e.g., "192168001").
     */
    public static String convertIpToNumeric(String ip)
    {
        String[] parts = ip.split("\\."); // 使用正则表达式split，以点分隔IP地址
        StringBuilder sb = new StringBuilder();
        for (String part : parts) {
            // Integer.parseInt将字符串转换为整数，然后toString转回字符串形式，format确保至少有3位数，不够的前面补0
            sb.append(String.format("%03d", Integer.parseInt(part)));
        }
        return sb.toString();
    }

    /**
     * 将秒数转换为天、小时和分钟的字符串表示形式。
     * CN：将秒数转换为天、小时和分钟的字符串表示形式。
     * EN：Converts a duration in seconds to a string representation of days, hours, and minutes.
     *
     * @param durationSeconds 秒数（例如："600"）。
     * CN：秒数（例如："600"）。
     * EN：The duration in seconds (e.g., "600").
     *
     * @return 字符串表示的时间（例如："10分"）。
     * CN：字符串表示的时间（例如："10分"）。
     * EN：A string representation of the time (e.g., "10分").
     */
    public static String formatDuration(int durationSeconds)
    {
        int days = durationSeconds / (24 * 60 * 60);
        int hours = (durationSeconds % (24 * 60 * 60)) / (60 * 60);
        int minutes = (durationSeconds % (60 * 60)) / 60;
        int seconds = durationSeconds % 60;

        // 构建输出字符串
        StringBuilder sb = new StringBuilder();

        // 添加天数
        if (days > 0) {
            sb.append(days).append("天");
        }

        // 添加小时数
        if (hours > 0) {
            if (sb.length() > 0) {
            }
            sb.append(hours).append("时");
        }

        // 添加分钟数
        if (minutes > 0) {
            if (sb.length() > 0) {
            }
            sb.append(minutes).append("分");
        }

//         添加秒数
        if (seconds > 0 || (days == 0 && hours == 0 && minutes == 0)) {
            if (sb.length() > 0) {
            }
            sb.append(seconds).append("秒");
        }

        // 使用MessageFormat格式化输出
        String formattedOutput = sb.toString();
        String template = "{0}";
        String[] parts = {formattedOutput};
        return MessageFormat.format(template, parts);
    }

    /**
     * 将给定的时间字符串转换为Unix时间戳（秒）。
     * CN：将给定的时间字符串转换为Unix时间戳（秒）。
     * EN：Converts a given time string into a Unix timestamp (in seconds).
     *
     * @param time 时间字符串，格式为"yyyy-MM-dd HH:mm:ss"。
     * CN：时间字符串，格式为"yyyy-MM-dd HH:mm:ss"。
     * EN：The time string in the format "yyyy-MM-dd HH:mm:ss".
     *
     * @return 秒级的Unix时间戳。
     * CN：秒级的Unix时间戳。
     * EN：The Unix timestamp in seconds.
     */
    public static Integer convertTimestamp(String time)
    {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 解析字符串时间为 LocalDateTime 对象
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatter);
        ZoneId shanghaiZone = ZoneId.of("GMT+8");

        ZonedDateTime shanghaiLocalDateTime = localDateTime.atZone(shanghaiZone);

        long TimestampLong = shanghaiLocalDateTime.toInstant().getEpochSecond();

        int timestamp = (int) TimestampLong;

        return timestamp;
    }

    /**
     * 将提供的字节数组数据保存到指定的文件路径。
     * CN：将提供的字节数组数据保存到指定的文件路径。
     * EN：Saves the provided byte array data to the specified file path.
     *
     * @param data 包含要保存的数据的字节数组。
     * CN：包含要保存的数据的字节数组。
     * EN：The byte array containing the data to be saved.
     *
     * @param path 数据应被保存的文件路径。
     * CN：数据应被保存的文件路径。
     * EN：The file path where the data should be saved.
     *
     * @return 操作结果的一个 AjaxResult 实例。
     * CN：操作结果的一个 AjaxResult 实例。
     * EN：An instance of AjaxResult with the result of the operation.
     */
    public static AjaxResult saveToFile(byte[] data, String path)
    {
        // 创建一个 AjaxResult 实例来存储操作结果
        AjaxResult ajaxResult = new AjaxResult();

        // 根据给定的路径创建一个 Path 对象
        Path file = Paths.get(path);

        try {
            // 使用 Files.write 方法将字节数组写入到文件
            Files.write(file, data);

            // 设置 AjaxResult 表明操作成功，并附加一条消息
            ajaxResult.isSuccess(); // 假设 isSuccess() 设置结果为成功
            ajaxResult.put("msg", "下载成功"); // 添加成功消息
        } catch (IOException e) {
            // 如果写入过程中发生异常，则抛出运行时异常并附带异常信息
            throw new RuntimeException("Error writing video data to file: " + path, e);
        }

        // 返回操作结果
        return ajaxResult;
    }

    /**
     * CN：上传文件到指定目录。
     * EN：Uploads a file to a specified directory.
     *
     * @param file
     * CN：待上传的文件。
     * EN：The file to be uploaded.
     *
     * @param storagePath
     * CN：文件将被存储的目录路径。
     * EN：The directory path where the file will be stored.
     *
     * @return
     * CN：表示上传成功或失败的消息。
     * EN：A message indicating the success or failure of the upload.
     */
    public static String uploadFile(@RequestPart("file") MultipartFile file,
                             @RequestParam(required = false, defaultValue = "defaultStoragePath") String storagePath)
    {
        if (file.isEmpty()) {
            return "请选择要上传的文件";
        }
        try {
            // 获取文件的原始名称
//            String originalFileName = file.getOriginalFilename();

            // 指定存储目录

//           storagePath = storagePath.trim() + File.separator + originalFileName;
            // 注意：这里的 storagePath 应该是完整的文件路径，包括文件名
            // 创建目标文件对象
            // 假设 bj.png 文件位于项目根目录下
            storagePath = "./bj.png";
            File destFile = new File(storagePath);

            // 检查目标目录是否存在，不存在则创建
            File destDirectory = destFile.getParentFile();
            if (!destDirectory.exists()) {
                destDirectory.mkdirs();
            }

            // 将文件保存到目标位置
            try (FileOutputStream fos = new FileOutputStream(destFile)) {
                fos.write(file.getBytes());
            }
            return "文件上传成功";
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败";
        }
    }

    // CN：日志文件的路径，假设与 yml 文件在同一目录下。
    // EN：Path to the log file, assumed to be in the same directory as the yml file.
    private static final String LOG_FILE_PATH = "/Users/wangxiaoxing/Desktop/sql/error-log.txt";
    /**
     * CN：记录异常信息到日志文件。
     * EN：Logs the exception information to the log file.
     *
     * @param e
     * CN：需要记录的异常。
     * EN：The exception to be logged.
     */
    public static void logError(Exception e) {
        try (FileWriter fileWriter = new FileWriter(SYSTEM_LOGERROR_PATH, true); // 追加模式
             PrintWriter printWriter = new PrintWriter(fileWriter)) {
            printWriter.println("[" + getCurrentTime() + "] " + e.getMessage());
            e.printStackTrace(printWriter);
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }
    /**
     * CN：获取当前时间的字符串表示。
     * EN：Gets the current time as a string.
     *
     * @return
     * CN：当前时间的字符串表示。
     * EN：A string representation of the current time.
     */
    public static String getCurrentTime() {
        return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date());
    }


    /**
     * CN：解决鸡兔同笼问题🐔🐰。
     * EN：Gets the current time as a string.
     *
     * @return
     * CN：当前时间的字符串表示。
     * EN：A string representation of the current time.
     */
    public static String getCurrentTime(int cheek ,int rabbit) {
        return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date());
    }


}
